﻿/*
    题目：从 1∼n这 n 个整数中随机选取任意多个，输出所有可能的选择方案。
    输入格式：输入一个整数 n
    输出格式：每行输出一种方案
             同一行内的数必须升序排列，相邻两个数用恰好 1 个空格隔开
             对于没有选任何数的方案，输出空行。
             本题有自定义校验器（SPJ），各行（不同方案）之间的顺序任意。

    输入样例：
             3
    输出样例：

            3
            2
            2 3
            1
            1 3
            1 2
            1 2 3
    



*/

#include <iostream>

// 引入命名空间std，避免与其他库中的iostream重复
using namespace std;

// 定义一个变量n，用于表示题目中给定的数的范围（例如，如果题目中给定n=3，则输出1 2 3）
int n;

// 定义一个递归函数dfs，用于输出所有符合条件的状态
void dfs(int u, int state)
{
    // 如果当前节点是最后一个节点，则输出当前状态
    if (u == n)
    {
        // 遍历状态中的每个位置，输出对应的数字
        for (int i = 0; i < n; i++)
            if (state >> i & 1)
                cout << i + 1 << ' ';
        return;
    }

    // 递归调用dfs函数，从下一个节点开始，状态为当前状态
    dfs(u + 1, state);
    // 递归调用dfs函数，从下一个节点开始，状态为当前状 
    dfs(u + 1, state | 1 << u);
}

// 主函数
int main()
{
    // 从标准输入中读入n的值
    cin >> n;
    // 调用dfs函数，从根节点开始，状态为初始状态0
    dfs(0, 0);
    // 程序结束
    return 0;
}